如何使用 abp 创建 module 并应用单独的数据库迁移 |
您所在的位置:网站首页 › blazor docs › 如何使用 abp 创建 module 并应用单独的数据库迁移 |
创建一个新模块 刚开始我是用 CLI 创建了一个新模块,然后手动把两个项目的 solution 文件集成到一块,麻烦而且易出错。后来发现原来 CLI 已经提供了将新模块添加到现有解决方案的命令,可参考:https://docs.abp.io/en/abp/latest/CLI#options-3 可以使用以下的命令: abp add-module MyModule --new --add-to-solution-file 注意运行该命令的时候要在 MainApp的目录下。这样 CLI 会在当前目录下创建一个 modules目录来存放新模块的解决方案,同时把所有项目添加到 MainApp的解决方案中,还会修改一些文件,这样我们就不用手动集成模块了。 添加新 Model 接下来继续按照官方文档来添加新的 Model:https://docs.abp.io/en/abp/latest/Tutorials/Part-1 具体内容这里就不展开了,可根据实际需要添加几个 Model。 步骤大概是: 添加 Model 更新模块 MyModule.EntityFrameworkCore项目中的 MyModuleDbContext.cs文件,添加相应的 DbSet 在 MyModuleDbContextModelCreatingExtensions.cs中添加模型映射 添加 Model 更新模块 MyModule.EntityFrameworkCore项目中的 MyModuleDbContext.cs文件,添加相应的 DbSet 在 MyModuleDbContextModelCreatingExtensions.cs中添加模型映射 接下来就是本文的重点,如何为模块添加一个单独的数据库并实现数据库迁移。 首先在 MainApp.EntityFrameworkCore项目中添加目录 EntityFrameworkCore\MyModule。在这个目录中创建一个名为 MyModuleMigrationsDbContext.cs的文件。内容如下: publicclassMyModuleMigrationsDbContext: AbpDbContext< MyModuleMigrationsDbContext> { publicMyModuleMigrationsDbContext( DbContextOptions options) : base( options) { } protectedoverridevoidOnModelCreating( ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.ConfigureMyModule; } } 然后添加一个名为 MyModuleMigrationsDbContextFactory.cs的文件: publicclassMyModuleMigrationsDbContextFactory: IDesignTimeDbContextFactory< MyModuleMigrationsDbContext> { publicMyModuleMigrationsDbContext CreateDbContext( string[] args ) { varconfiguration = BuildConfiguration; varbuilder = newDbContextOptionsBuilder .UseSqlServer(configuration.GetConnectionString( "MyModule")); returnnewMyModuleMigrationsDbContext(builder.Options); } privatestaticIConfigurationRoot BuildConfiguration( ) { varbuilder = newConfigurationBuilder .SetBasePath(Path.Combine(Directory.GetCurrentDirectory, "../MainApp.DbMigrator/")) .AddJsonFile( "appsettings.json", optional: false); returnbuilder.Build; } } 这两个文件与 MainApp 的 DbContext 内容是类似的,大家可以比较一下。因为模块也要从 appsettings.json中读取数据库配置,因此我们需要修改 appsettings.json中的数据库链接字符串,注意需要修改两个位置:一个是 MainApp.DbMigrator项目中的,另一个是 MainApp.HttpApi.Host 项目中的。仿照 MainApp 的连接字符串添加一个名为 MyModule 的即可。这样模块就可以有一个单独的数据库了。 运行模块数据库迁移 创建了新的 Model 后,我们要对数据进行迁移,以应用这些更改。 将 terminal 导航到 MainApp.EntityFrameworkCore目录,运行以下命令: dotnet ef migrations add migrationName --context MyModuleMigrationsDbContext --output-dir Migrations/MyModule 注意要指定要迁移的 DbContext,也就是 MyModuleMigrationsDbContext 。同时我们还将迁移文件放在 Migrations/MyModule目录下,这样不会与 MainApp 的迁移文件混淆。 如果一切正常,我们就可以在指定目录下看到生成的迁移文件了。 运行以下命令以应用数据库迁移: dotnet ef database update --context MyModuleMigrationsDbContext 这样模块的数据库迁移就完成了。 其他设置 接下来按照官方文档继续添加相应的 AppService 及其接口等。这样我们的模块已经与 MainApp 是隔离的了,包括 Blazor 页面也是在一个单独的项目里。 如果运行 .HttpApi.Host没有看到模块的 API,可以检查下 MainApp.HttpApi.Host项目中的 MainAppHttpApiHostModule.cs文件,看是否配置正确: privatevoidConfigureConventionalControllers( ) { Configure(options => { options.ConventionalControllers.Create( typeof(MainAppApplicationModule).Assembly); // Add the below line options.ConventionalControllers.Create( typeof(MyModuleApplicationModule).Assembly); }); } 再次运行 .HttpApi.Host和 .Blazor项目,可以看到前端页面已经添加了一个新模块的链接,只是内容页是空的。接下来我们就可以在 MyModule 解决方案里的 Blazor 项目中开发前端页面了。 在添加 Model 后我还遇到过一个错误,如下图所示: Autofact.Core.DependencyResolutionException: 'An exception was thrown while activating Volo.Abp.IdentityServer.Grants.PersistedGrantStore ....' Autofact.Core.DependencyResolutionException: 'An exception was thrown while activating Volo.Abp.IdentityServer.Grants.PersistedGrantStore ....' 乍一看还以为是 IdentityServer 的问题,其实不是。展开看 inner exception 就会发现这个是我们添加的 Dto 的 mapping 导致的。因为 Entity 是有 Id 的,但 CreateUpdateProductDto 没有Id,所以 mapping 出错了。如果遇到这种情况,可以将 Id 省略掉: CreateMap.Ignore(x => x.Id); 学习了几天感觉这个框架还是挺方便的,功能非常强大,但学习起来还是有一定难度的。框架各部分之间的依赖非常多,如果不仔细研究,很容易处处碰壁。好在官方文档写的还是相对比较详细的,只是部分文档还有空缺。希望官方以后补足吧。是否使用框架开发是一个两难的问题,太依赖框架可能会失去对细节的把控,处处受制于框架的实现;不使用框架就得自己重复造轮子。只能见仁见智了。 万水千山总是情,点个关注行不行 天若有情天亦老,加个粉丝好不好返回搜狐,查看更多 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |